#eliminating redundant columns
MasterData<- select(MasterData, "ID..","Sex","Linguistic.Background","Final.Grade","Incorrect...unaware","Per_correct","Per_Aware","Time.Spent..HW.","Time.Spent..Pronunciation.Practice.","Time.Spent..LearnSmart.","Total.HW...Correct","Total.LS...Complete")
Error: Strings must match column names. Unknown columns: Per_Aware

#Time spent on Connect homework, Percentage of correct homework responses
ggplot(MasterData, aes(Time_hw,Per_correct_hw))+ geom_point() + stat_sum(aes(group = 1))
#Time spent on Connect homework, Percentage of correct homework responses
ggplot(MasterData, aes(Time_hw,Per_correct_hw))+ geom_point() + stat_sum(aes(group = 1))

#Time spent on Connect homework, Time spent on LearnSmart adaptive activities
ggplot(MasterData, aes(Time_hw,Time_LS))+ geom_point() + stat_sum(aes(group = 1))

#Percentage of correct homework responses, Final course grade
ggplot(MasterData, aes(Per_correct_hw,Final_grade))+ geom_point() + stat_sum(aes(group = 1))

#Percentage of correct LearnSmart responses, Percentage of awareness of correct/incorrect responses
ggplot(MasterData, aes(Per_correct,Per_aware))+ geom_point() + stat_sum(aes(group = 1))

#Percentage of completion of assigned LearnSmart activities, Final course grade
ggplot(MasterData, aes(Per_complete_LS,Final_grade))+ geom_point() + stat_sum(aes(group = 1))

#Percentage of completion of assigned LearnSmart activities, Percentage of incorrect and unaware LearnSmart responses
ggplot(MasterData, aes(Per_complete_LS,IU))+ geom_point() + stat_sum(aes(group = 1))

#Percentage of completion of assigned LearnSmart activities, Percentage of incorrect and unaware LearnSmart responses
ggplot(MasterData, aes(Per_complete_LS,IU))+ geom_point() + stat_sum(aes(group = 1))

#Time spent on LearnSmart adaptive activities, Final course grade
ggplot(MasterData, aes(Time_LS,Final_grade))+ geom_point() + stat_sum(aes(group = 1))

#Percentage of incorrect and unaware LearnSmart responses, Final course grade
ggplot(MasterData, aes(IU,Final_grade))+ geom_point() + stat_sum(aes(group = 1))

#Percentage of incorrect and unaware LearnSmart responses, Time spent on LearnSmart adaptive activities
ggplot(MasterData, aes(IU,Time_LS))+ geom_point() + stat_sum(aes(group = 1))

#Percentage of incorrect and unaware LearnSmart responses, Time spent on Connect homework
ggplot(MasterData, aes(IU,Time_hw))+ geom_point() + stat_sum(aes(group = 1))

sapply(ScaledData[,4:12], sd)
    Final_grade              IU     Per_correct       Per_aware         Time_hw       Time_pron         Time_LS 
              1               1               1               1               1               1               1 
 Per_correct_hw Per_complete_LS 
              1               1 
#Creating the Within Group Sum of Squares function
wssplot <- function(data, nc=15, seed=1234){
  wss <- (nrow(data)-1)*sum(apply(data,2,var))
  for (i in 2:nc){
    set.seed(seed)
    wss[i] <- sum(kmeans(data, centers=i)$withinss)}
  plot(1:nc, wss, type="b", xlab="Number of Clusters",
       ylab="Within groups sum of squares")}
#Create the WSS Graph
wssplot(ScaledData[,4:12],nc=15,seed=1234)

#Create and examine several different possible cluster solutions
threeclusterkmeans<-kmeans(ScaledData[,4:12], 3, nstart=10)
threeclusterkmeans
fourclusterkmeans<-kmeans(ScaledData[,4:12], 4, nstart=10)
fourclusterkmeans
#Assign the clusters for each observation for k=3,4,5 to a new dataframe
Clusters<-data.frame(MasterData, threeclusterkmeans$cluster, fourclusterkmeans$cluster, fiveclusterkmeans$cluster)
Error in data.frame(MasterData, threeclusterkmeans$cluster, fourclusterkmeans$cluster,  : 
  object 'fiveclusterkmeans' not found
#Graph the different solutions - Three Clusters.
#Shapes indicate Language Background. To change which variable is marked by shape, change the name of the variable in "shape=Language"
ggplot(Clusters, aes(Time_hw,Per_correct_hw, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(Time_hw,Time_LS, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(Per_correct_hw,Final_grade, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(Per_correct,Per_aware, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(Per_complete_LS,Final_grade, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(Per_complete_LS,IU, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(Time_LS,Final_grade, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(IU,Final_grade, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(IU,Time_LS, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

ggplot(Clusters, aes(IU,Time_hw, group = factor(threeclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(threeclusterkmeans.cluster))))

#Graph the different solutions - Four Clusters.
#Shapes indicate Language Background. To change which variable is marked by shape, change the name of the variable in "shape=Language
ggplot(Clusters, aes(Time_hw,Per_correct_hw, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(Time_hw,Time_LS, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(Per_correct_hw,Final_grade, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(Per_correct,Per_aware, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(Per_complete_LS,Final_grade, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(Per_complete_LS,IU, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(Time_LS,Final_grade, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(IU,Final_grade, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(IU,Time_LS, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

ggplot(Clusters, aes(IU,Time_hw, group = factor(fourclusterkmeans.cluster))) + geom_point((aes(size=2,shape=Sex, color = factor(fourclusterkmeans.cluster))))

#Graph the different solutions - Five Clusters.
#Shapes indicate Language Background. To change which variable is marked by shape, change the name of the variable in "shape=Language
ggplot(Clusters, aes(Time_hw,Per_correct_hw, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(Time_hw,Time_LS, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(Per_correct_hw,Final_grade, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(Per_correct,Per_aware, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(Per_complete_LS,Final_grade, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(Per_complete_LS,IU, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(Time_LS,Final_grade, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(IU,Final_grade, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(IU,Time_LS, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
ggplot(Clusters, aes(IU,Time_hw, group = factor(fiveclusterkmeans.cluster))) + geom_point((aes(shape=Language, color = factor(fiveclusterkmeans.cluster))))
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQogIApgYGB7cn0KI2xvYWQgcmVsZXZhbnQgbGlicmFyaWVzCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKCiNJbXBvcnQgZGF0YSBpbnRvIGEgbmV3IGRhdGEgZnJhbWUKTWFzdGVyRGF0YTwtcmVhZC5jc3YoIn4vZG93bmxvYWRzL0ZSRTExMjAgRGF0YSBTdW1tYXJ5IC0gUkFXLmNzdiIpCiNSZW1vdmluZyBzdHVkZW50cyB0aGF0IHdlcmUgbm90IHJlcXVpcmVkIHRvIGRvIHRoZSBMUyBleGVyY2lzZXMKTWFzdGVyRGF0YTwtTWFzdGVyRGF0YVtNYXN0ZXJEYXRhJExTLlJlcXVpcmVkPT0ieSIsXQojUmVtb3ZpbmcgdGhlIGZldyBzdHVkZW50cyB3aXRoIGxpbmd1aXN0aWMgYmFja2dyb3VuZCBkaWZmZXJlbnQgdGhhbiBFbmdsaXNoLCBTcG5haXNoLCBvciBDcmVvbGUgZHVlIHRvIHZlcnkgbG93IG51bWJlcnMKTWFzdGVyRGF0YTwtTWFzdGVyRGF0YVtNYXN0ZXJEYXRhJExpbmd1aXN0aWMuQmFja2dyb3VuZCAlaW4lIGMoIkVuZ2xpc2giLCJDcmVvbGUiLCJTcGFuaXNoIiksXQojQ3JlYXRpbmcgdGhlIGNhbGN1bGF0ZWQgZmllbGRzIG9mIFBlcl9hd2FyZSBhbmQgUGVyX2NvcnJlY3QKTWFzdGVyRGF0YSA8LSBNYXN0ZXJEYXRhICU+JSBtdXRhdGUoUGVyX2NvcnJlY3QgPSBDb3JyZWN0Li4uYXdhcmUrQ29ycmVjdC4uLnVuYXdhcmUpCk1hc3RlckRhdGEgPC0gTWFzdGVyRGF0YSAlPiUgbXV0YXRlKFBlcl9hd2FyZSA9IENvcnJlY3QuLi5hd2FyZStJbmNvcnJlY3QuLi5hd2FyZSkKI2VsaW1pbmF0aW5nIHJlZHVuZGFudCBjb2x1bW5zCk1hc3RlckRhdGE8LSBzZWxlY3QoTWFzdGVyRGF0YSwgIklELi4iLCJTZXgiLCJMaW5ndWlzdGljLkJhY2tncm91bmQiLCJGaW5hbC5HcmFkZSIsIkluY29ycmVjdC4uLnVuYXdhcmUiLCJQZXJfY29ycmVjdCIsIlBlcl9hd2FyZSIsIlRpbWUuU3BlbnQuLkhXLiIsIlRpbWUuU3BlbnQuLlByb251bmNpYXRpb24uUHJhY3RpY2UuIiwiVGltZS5TcGVudC4uTGVhcm5TbWFydC4iLCJUb3RhbC5IVy4uLkNvcnJlY3QiLCJUb3RhbC5MUy4uLkNvbXBsZXRlIikKI0NoYW5naW5nIGNvbHVtbiBuYW1lcwpuYW1lcyhNYXN0ZXJEYXRhKSA8LSBjKCJJRCIsIlNleCIsIkxhbmd1YWdlIiwiRmluYWxfZ3JhZGUiLCJJVSIsIlBlcl9jb3JyZWN0IiwiUGVyX2F3YXJlIiwiVGltZV9odyIsIlRpbWVfcHJvbiIsIlRpbWVfTFMiLCJQZXJfY29ycmVjdF9odyIsIlBlcl9jb21wbGV0ZV9MUyIpCgpgYGAKCmBgYHtyfQojRXhhbWluZSBzY2F0dGVyIHBsb3RzIGZvciBkaWZmZXJlbnQgdmFyaWFibGUgY29tYmluYXRpb24gcGFpcnMKI0NyZWF0aW5nIHNjYXR0ZXIgcGxvdHMgZm9yIGFsbCBwYWlycwpwYWlycyhNYXN0ZXJEYXRhKQojVGltZSBzcGVudCBvbiBDb25uZWN0IGhvbWV3b3JrLCBQZXJjZW50YWdlIG9mIGNvcnJlY3QgaG9tZXdvcmsgcmVzcG9uc2VzCmdncGxvdChNYXN0ZXJEYXRhLCBhZXMoVGltZV9odyxQZXJfY29ycmVjdF9odykpKyBnZW9tX3BvaW50KCkgKyBzdGF0X3N1bShhZXMoZ3JvdXAgPSAxKSkKI1RpbWUgc3BlbnQgb24gQ29ubmVjdCBob21ld29yaywgVGltZSBzcGVudCBvbiBMZWFyblNtYXJ0IGFkYXB0aXZlIGFjdGl2aXRpZXMKZ2dwbG90KE1hc3RlckRhdGEsIGFlcyhUaW1lX2h3LFRpbWVfTFMpKSsgZ2VvbV9wb2ludCgpICsgc3RhdF9zdW0oYWVzKGdyb3VwID0gMSkpCiNQZXJjZW50YWdlIG9mIGNvcnJlY3QgaG9tZXdvcmsgcmVzcG9uc2VzLCBGaW5hbCBjb3Vyc2UgZ3JhZGUKZ2dwbG90KE1hc3RlckRhdGEsIGFlcyhQZXJfY29ycmVjdF9odyxGaW5hbF9ncmFkZSkpKyBnZW9tX3BvaW50KCkgKyBzdGF0X3N1bShhZXMoZ3JvdXAgPSAxKSkKI1BlcmNlbnRhZ2Ugb2YgY29ycmVjdCBMZWFyblNtYXJ0IHJlc3BvbnNlcywgUGVyY2VudGFnZSBvZiBhd2FyZW5lc3Mgb2YgY29ycmVjdC9pbmNvcnJlY3QgcmVzcG9uc2VzCmdncGxvdChNYXN0ZXJEYXRhLCBhZXMoUGVyX2NvcnJlY3QsUGVyX2F3YXJlKSkrIGdlb21fcG9pbnQoKSArIHN0YXRfc3VtKGFlcyhncm91cCA9IDEpKQojUGVyY2VudGFnZSBvZiBjb21wbGV0aW9uIG9mIGFzc2lnbmVkIExlYXJuU21hcnQgYWN0aXZpdGllcywgRmluYWwgY291cnNlIGdyYWRlCmdncGxvdChNYXN0ZXJEYXRhLCBhZXMoUGVyX2NvbXBsZXRlX0xTLEZpbmFsX2dyYWRlKSkrIGdlb21fcG9pbnQoKSArIHN0YXRfc3VtKGFlcyhncm91cCA9IDEpKQojUGVyY2VudGFnZSBvZiBjb21wbGV0aW9uIG9mIGFzc2lnbmVkIExlYXJuU21hcnQgYWN0aXZpdGllcywgUGVyY2VudGFnZSBvZiBpbmNvcnJlY3QgYW5kIHVuYXdhcmUgTGVhcm5TbWFydCByZXNwb25zZXMKZ2dwbG90KE1hc3RlckRhdGEsIGFlcyhQZXJfY29tcGxldGVfTFMsSVUpKSsgZ2VvbV9wb2ludCgpICsgc3RhdF9zdW0oYWVzKGdyb3VwID0gMSkpCiNUaW1lIHNwZW50IG9uIExlYXJuU21hcnQgYWRhcHRpdmUgYWN0aXZpdGllcywgRmluYWwgY291cnNlIGdyYWRlCmdncGxvdChNYXN0ZXJEYXRhLCBhZXMoVGltZV9MUyxGaW5hbF9ncmFkZSkpKyBnZW9tX3BvaW50KCkgKyBzdGF0X3N1bShhZXMoZ3JvdXAgPSAxKSkKI1BlcmNlbnRhZ2Ugb2YgaW5jb3JyZWN0IGFuZCB1bmF3YXJlIExlYXJuU21hcnQgcmVzcG9uc2VzLCBGaW5hbCBjb3Vyc2UgZ3JhZGUKZ2dwbG90KE1hc3RlckRhdGEsIGFlcyhJVSxGaW5hbF9ncmFkZSkpKyBnZW9tX3BvaW50KCkgKyBzdGF0X3N1bShhZXMoZ3JvdXAgPSAxKSkKI1BlcmNlbnRhZ2Ugb2YgaW5jb3JyZWN0IGFuZCB1bmF3YXJlIExlYXJuU21hcnQgcmVzcG9uc2VzLCBUaW1lIHNwZW50IG9uIExlYXJuU21hcnQgYWRhcHRpdmUgYWN0aXZpdGllcwpnZ3Bsb3QoTWFzdGVyRGF0YSwgYWVzKElVLFRpbWVfTFMpKSsgZ2VvbV9wb2ludCgpICsgc3RhdF9zdW0oYWVzKGdyb3VwID0gMSkpCiNQZXJjZW50YWdlIG9mIGluY29ycmVjdCBhbmQgdW5hd2FyZSBMZWFyblNtYXJ0IHJlc3BvbnNlcywgVGltZSBzcGVudCBvbiBDb25uZWN0IGhvbWV3b3JrCmdncGxvdChNYXN0ZXJEYXRhLCBhZXMoSVUsVGltZV9odykpKyBnZW9tX3BvaW50KCkgKyBzdGF0X3N1bShhZXMoZ3JvdXAgPSAxKSkKYGBgCgpgYGB7cn0KI0NyZWF0ZSBuZXcgZGF0YSBmcmFtZSBmb3Igc2NhbGVkIGRhdGEsIHJlbW92aW5nIG5vbi1jbHVzdGVyaW5nIHZhcmlhYmxlcwpTY2FsZWREYXRhPC1hcy5kYXRhLmZyYW1lKGNiaW5kKE1hc3RlckRhdGFbLDE6M10sc2NhbGUoc2VsZWN0KE1hc3RlckRhdGEsIEZpbmFsX2dyYWRlOlBlcl9jb21wbGV0ZV9MUykpKSkKI1ZhbGlkYXRpbmcgc2NhbGluZyBieSBsb29raW5nIGF0IG1lYW5zIGFuZCBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBzY2FsZWQgY29sdW1ucwpzYXBwbHkoU2NhbGVkRGF0YVssNDoxMl0sIG1lYW4pCnNhcHBseShTY2FsZWREYXRhWyw0OjEyXSwgc2QpCmBgYAoKYGBge3J9CiNDcmVhdGluZyB0aGUgV2l0aGluIEdyb3VwIFN1bSBvZiBTcXVhcmVzIGZ1bmN0aW9uCndzc3Bsb3QgPC0gZnVuY3Rpb24oZGF0YSwgbmM9MTUsIHNlZWQ9MTIzNCl7CiAgd3NzIDwtIChucm93KGRhdGEpLTEpKnN1bShhcHBseShkYXRhLDIsdmFyKSkKICBmb3IgKGkgaW4gMjpuYyl7CiAgICBzZXQuc2VlZChzZWVkKQogICAgd3NzW2ldIDwtIHN1bShrbWVhbnMoZGF0YSwgY2VudGVycz1pKSR3aXRoaW5zcyl9CiAgcGxvdCgxOm5jLCB3c3MsIHR5cGU9ImIiLCB4bGFiPSJOdW1iZXIgb2YgQ2x1c3RlcnMiLAogICAgICAgeWxhYj0iV2l0aGluIGdyb3VwcyBzdW0gb2Ygc3F1YXJlcyIpfQoKI0NyZWF0ZSB0aGUgV1NTIEdyYXBoCndzc3Bsb3QoU2NhbGVkRGF0YVssNDoxMl0sbmM9MTUsc2VlZD0xMjM0KQpgYGAKYGBge3J9CiNDcmVhdGUgYW5kIGV4YW1pbmUgc2V2ZXJhbCBkaWZmZXJlbnQgcG9zc2libGUgY2x1c3RlciBzb2x1dGlvbnMKdGhyZWVjbHVzdGVya21lYW5zPC1rbWVhbnMoU2NhbGVkRGF0YVssNDoxMl0sIDMsIG5zdGFydD0xMCkKdGhyZWVjbHVzdGVya21lYW5zCmZvdXJjbHVzdGVya21lYW5zPC1rbWVhbnMoU2NhbGVkRGF0YVssNDoxMl0sIDQsIG5zdGFydD0xMCkKZm91cmNsdXN0ZXJrbWVhbnMKYGBgCmBgYHtyfQojQXNzaWduIHRoZSBjbHVzdGVycyBmb3IgZWFjaCBvYnNlcnZhdGlvbiBmb3Igaz0zLDQgdG8gYSBuZXcgZGF0YWZyYW1lCkNsdXN0ZXJzPC1kYXRhLmZyYW1lKFNjYWxlZERhdGEsIHRocmVlY2x1c3RlcmttZWFucyRjbHVzdGVyLCBmb3VyY2x1c3RlcmttZWFucyRjbHVzdGVyKQpgYGAKCmBgYHtyfQojR3JhcGggdGhlIGRpZmZlcmVudCBzb2x1dGlvbnMgLSBUaHJlZSBDbHVzdGVycy4KI1NoYXBlcyBpbmRpY2F0ZSBMYW5ndWFnZSBCYWNrZ3JvdW5kLiBUbyBjaGFuZ2Ugd2hpY2ggdmFyaWFibGUgaXMgbWFya2VkIGJ5IHNoYXBlLCBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGluICJzaGFwZT1MYW5ndWFnZSIKZ2dwbG90KENsdXN0ZXJzLCBhZXMoVGltZV9odyxQZXJfY29ycmVjdF9odywgZ3JvdXAgPSBmYWN0b3IodGhyZWVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKHRocmVlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhUaW1lX2h3LFRpbWVfTFMsIGdyb3VwID0gZmFjdG9yKHRocmVlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3Rvcih0aHJlZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSkKZ2dwbG90KENsdXN0ZXJzLCBhZXMoUGVyX2NvcnJlY3RfaHcsRmluYWxfZ3JhZGUsIGdyb3VwID0gZmFjdG9yKHRocmVlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3Rvcih0aHJlZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSkKZ2dwbG90KENsdXN0ZXJzLCBhZXMoUGVyX2NvcnJlY3QsUGVyX2F3YXJlLCBncm91cCA9IGZhY3Rvcih0aHJlZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaGFwZT1MYW5ndWFnZSwgY29sb3IgPSBmYWN0b3IodGhyZWVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmdncGxvdChDbHVzdGVycywgYWVzKFBlcl9jb21wbGV0ZV9MUyxGaW5hbF9ncmFkZSwgZ3JvdXAgPSBmYWN0b3IodGhyZWVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKHRocmVlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhQZXJfY29tcGxldGVfTFMsSVUsIGdyb3VwID0gZmFjdG9yKHRocmVlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3Rvcih0aHJlZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSkKZ2dwbG90KENsdXN0ZXJzLCBhZXMoVGltZV9MUyxGaW5hbF9ncmFkZSwgZ3JvdXAgPSBmYWN0b3IodGhyZWVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKHRocmVlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhJVSxGaW5hbF9ncmFkZSwgZ3JvdXAgPSBmYWN0b3IodGhyZWVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKHRocmVlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhJVSxUaW1lX0xTLCBncm91cCA9IGZhY3Rvcih0aHJlZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaGFwZT1MYW5ndWFnZSwgY29sb3IgPSBmYWN0b3IodGhyZWVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmdncGxvdChDbHVzdGVycywgYWVzKElVLFRpbWVfaHcsIGdyb3VwID0gZmFjdG9yKHRocmVlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3Rvcih0aHJlZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSkKYGBgCgpgYGB7cn0KI0dyYXBoIHRoZSBkaWZmZXJlbnQgc29sdXRpb25zIC0gRm91ciBDbHVzdGVycy4KI1NoYXBlcyBpbmRpY2F0ZSBMYW5ndWFnZSBCYWNrZ3JvdW5kLiBUbyBjaGFuZ2Ugd2hpY2ggdmFyaWFibGUgaXMgbWFya2VkIGJ5IHNoYXBlLCBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGluICJzaGFwZT1MYW5ndWFnZQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhUaW1lX2h3LFBlcl9jb3JyZWN0X2h3LCBncm91cCA9IGZhY3Rvcihmb3VyY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNpemU9MixzaGFwZT1MYW5ndWFnZSwgY29sb3IgPSBmYWN0b3IoZm91cmNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSkKZ2dwbG90KENsdXN0ZXJzLCBhZXMoVGltZV9odyxUaW1lX0xTLCBncm91cCA9IGZhY3Rvcihmb3VyY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNpemU9MixzaGFwZT1MYW5ndWFnZSwgY29sb3IgPSBmYWN0b3IoZm91cmNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSkKZ2dwbG90KENsdXN0ZXJzLCBhZXMoUGVyX2NvcnJlY3RfaHcsRmluYWxfZ3JhZGUsIGdyb3VwID0gZmFjdG9yKGZvdXJjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2l6ZT0yLHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3Rvcihmb3VyY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhQZXJfY29ycmVjdCxQZXJfYXdhcmUsIGdyb3VwID0gZmFjdG9yKGZvdXJjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2l6ZT0yLHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3Rvcihmb3VyY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhQZXJfY29tcGxldGVfTFMsRmluYWxfZ3JhZGUsIGdyb3VwID0gZmFjdG9yKGZvdXJjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2l6ZT0yLHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3Rvcihmb3VyY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhQZXJfY29tcGxldGVfTFMsSVUsIGdyb3VwID0gZmFjdG9yKGZvdXJjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2l6ZT0yLHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3Rvcihmb3VyY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhUaW1lX0xTLEZpbmFsX2dyYWRlLCBncm91cCA9IGZhY3Rvcihmb3VyY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNpemU9MixzaGFwZT1MYW5ndWFnZSwgY29sb3IgPSBmYWN0b3IoZm91cmNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSkKZ2dwbG90KENsdXN0ZXJzLCBhZXMoSVUsRmluYWxfZ3JhZGUsIGdyb3VwID0gZmFjdG9yKGZvdXJjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2l6ZT0yLHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3Rvcihmb3VyY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhJVSxUaW1lX0xTLCBncm91cCA9IGZhY3Rvcihmb3VyY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNpemU9MixzaGFwZT1MYW5ndWFnZSwgY29sb3IgPSBmYWN0b3IoZm91cmNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSkKZ2dwbG90KENsdXN0ZXJzLCBhZXMoSVUsVGltZV9odywgZ3JvdXAgPSBmYWN0b3IoZm91cmNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaXplPTIsc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKGZvdXJjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmBgYApgYGB7cn0KI0dyYXBoIHRoZSBkaWZmZXJlbnQgc29sdXRpb25zIC0gRml2ZSBDbHVzdGVycy4KI1NoYXBlcyBpbmRpY2F0ZSBMYW5ndWFnZSBCYWNrZ3JvdW5kLiBUbyBjaGFuZ2Ugd2hpY2ggdmFyaWFibGUgaXMgbWFya2VkIGJ5IHNoYXBlLCBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGluICJzaGFwZT1MYW5ndWFnZQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhUaW1lX2h3LFBlcl9jb3JyZWN0X2h3LCBncm91cCA9IGZhY3RvcihmaXZlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3RvcihmaXZlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhUaW1lX2h3LFRpbWVfTFMsIGdyb3VwID0gZmFjdG9yKGZpdmVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKGZpdmVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmdncGxvdChDbHVzdGVycywgYWVzKFBlcl9jb3JyZWN0X2h3LEZpbmFsX2dyYWRlLCBncm91cCA9IGZhY3RvcihmaXZlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3RvcihmaXZlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhQZXJfY29ycmVjdCxQZXJfYXdhcmUsIGdyb3VwID0gZmFjdG9yKGZpdmVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkgKyBnZW9tX3BvaW50KChhZXMoc2hhcGU9TGFuZ3VhZ2UsIGNvbG9yID0gZmFjdG9yKGZpdmVjbHVzdGVya21lYW5zLmNsdXN0ZXIpKSkpCmdncGxvdChDbHVzdGVycywgYWVzKFBlcl9jb21wbGV0ZV9MUyxGaW5hbF9ncmFkZSwgZ3JvdXAgPSBmYWN0b3IoZml2ZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaGFwZT1MYW5ndWFnZSwgY29sb3IgPSBmYWN0b3IoZml2ZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSkKZ2dwbG90KENsdXN0ZXJzLCBhZXMoUGVyX2NvbXBsZXRlX0xTLElVLCBncm91cCA9IGZhY3RvcihmaXZlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3RvcihmaXZlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhUaW1lX0xTLEZpbmFsX2dyYWRlLCBncm91cCA9IGZhY3RvcihmaXZlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpICsgZ2VvbV9wb2ludCgoYWVzKHNoYXBlPUxhbmd1YWdlLCBjb2xvciA9IGZhY3RvcihmaXZlY2x1c3RlcmttZWFucy5jbHVzdGVyKSkpKQpnZ3Bsb3QoQ2x1c3RlcnMsIGFlcyhJVSxGaW5hbF9ncmFkZSwgZ3JvdXAgPSBmYWN0b3IoZml2ZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaGFwZT1MYW5ndWFnZSwgY29sb3IgPSBmYWN0b3IoZml2ZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSkKZ2dwbG90KENsdXN0ZXJzLCBhZXMoSVUsVGltZV9MUywgZ3JvdXAgPSBmYWN0b3IoZml2ZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaGFwZT1MYW5ndWFnZSwgY29sb3IgPSBmYWN0b3IoZml2ZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSkKZ2dwbG90KENsdXN0ZXJzLCBhZXMoSVUsVGltZV9odywgZ3JvdXAgPSBmYWN0b3IoZml2ZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSArIGdlb21fcG9pbnQoKGFlcyhzaGFwZT1MYW5ndWFnZSwgY29sb3IgPSBmYWN0b3IoZml2ZWNsdXN0ZXJrbWVhbnMuY2x1c3RlcikpKSk=